package com.example.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Slf4j
//@Aspect
//@Component
public class AnnotationAspect2 {

    /**
     * | JoinPoint     | 连接点：程序执行的某个点，Spring AOP 只支持“方法执行”作为连接点
     * | Pointcut      | 切入点：定义哪些连接点要被拦截，例如哪些类、哪些方法
     * | Advice        | 通知：在连接点上实际执行的代码逻辑，比如日志打印、权限检查等
     * | Aspect        | 切面：通知和切入点的组合，表示“在哪些点做什么事”
     * | Target Object | 目标对象：被代理的原始业务类对象
     * | AOP Proxy     | 代理对象：Spring AOP 创建的对象，用来包裹目标对象并执行增强逻辑
     * | Weaving       | 织入：把通知应用到连接点（即方法执行）上的过程
     */

    /**
     * execution()	方法执行的连接点
     *
     * @annotation() 匹配使用了某注解的方法
     */

    @Pointcut("@annotation(com.example.aspect.AspectAnnotation)")
    public void callAnnotation() {
    }

    @Before("callAnnotation()")
    public void before() {
        log.info("AnnotationAspect before");
    }

    @After("callAnnotation()")
    public void after() {
        log.info("AnnotationAspect after");
    }

}
